package org.codeart.proxy.example03;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class UserLogProxy implements MethodInterceptor {

    /**
     * 生成Cglib动态代理类的方法
     */
    public Object getLogProxy(Object target) {
        // 增强器类
        Enhancer enhancer = new Enhancer();

        // 设置代理类的父类字节码对象
        enhancer.setSuperclass(target.getClass());

        // 设置回调
        enhancer.setCallback(this);

        // 创建代理类对象并返回
        return enhancer.create();
    }

    /**
     * 实现回调方法
     * @param o           代理对象
     * @param method      目标对象中的方法Method实例
     * @param args        实际参数
     * @param methodProxy 代理类对象中的方法的Method实例
     */
    @Override
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        Calendar instance = Calendar.getInstance();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        System.out.println(formatter.format(instance.getTime()) + "[" + methodProxy.getSuperName() + "] 查询用户信息: ");
        return methodProxy.invokeSuper(o, args);
    }
}
